package com.calvin.study.copyonwritearraylist;

import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;


public class CopyOnWriteArrayListDemo {

	public static void main(String[] args) {
		
		//List<String> list = Collections.synchronizedList(new ArrayList<>());
		List<String> list = new CopyOnWriteArrayList<String>();
		/**
		 * 写时复制 copyOnWrite 容器即写时复制的容器
		 * 往容器添加元素的时候,不直接往当前容器object[]添加,而是先将当前容器object[]进行 copy 复制出一个新的object[]
		 * newElements 然后向新容器object[] newElements 里面添加元素 添加元素后, 再将原容器的引用指向新的容器
		 * setArray(newElements); 这样的好处是可以对copyOnWrite容器进行并发的读,而不需要加锁
		 * 因为当前容器不会添加任何容器.所以copyOnwrite容器也是一种 读写分离的思想,读和写不同的容器.
		 */
		for (int i = 0, len = 10; i < len; i++) {
			new Thread(() -> {
				list.add(UUID.randomUUID().toString());
				System.out.println(list);
			}, "T" + i).start();
		}
	}
}


